/*******************************************************************************
 * Copyright (c) 2012 Alexandr Tsvetkov.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * 
 * Contributors:
 *     Alexandr Tsvetkov - initial API and implementation
 * 
 * Project:
 *     TAO Library
 * 
 * File name:
 *     NetCheckerHelper.java
 *     
 * License agreement:
 *
 * 1. This code is published AS IS. Author is not responsible for any damage that can be
 *    caused by any application that uses this code.
 * 2. Author does not give a garantee, that this code is error free.
 * 3. This code can be used in NON-COMMERCIAL applications AS IS without any special
 *    permission from author.
 * 4. This code can be modified without any special permission from author IF AND ONLY IF
 *    this license agreement will remain unchanged.
 * 5. SPECIAL PERMISSION for this code usage in COMMERCIAL application SHOULD be obtained
 *    from author.
 ******************************************************************************/
package ua.at.tsvetkov.net;

import ua.at.tsvetkov.application.AppConfig;
import ua.at.tsvetkov.strings.Const;
import ua.at.tsvetkov.util.Log;
import android.app.Activity;
import android.widget.Toast;

/**
 * Проверка наличия соединения с сайтом и выдача сообщений пользователю
 * 
 * @author A.Tsvetkov 2010 http://tsvetkov.at.ua mailto:al@ukr.net
 */
public class NetCheckerHelper {

	/**
	 * Проверяет наличин соединения с указанным сайтом
	 * 
	 * @param url сайт для тестирования соединения
	 * @return наличие соединения
	 */
	public static boolean isHaveConnection(String url) {
		switch (NetChecker.checkNet(AppConfig.getContext(), url)) {
			case CONNECTION_MISSING:
				return false;
			case NO_NET:
				return false;
			case FAULTY_URL:
				return false;
			case NET_OK:
				return true;
			case NOT_DEFINED_YET:
				break;
		}
		return false;
	}

	/**
	 * Проверяет соединение с сайтом и выдающий сообщение на экран и в лог при ошибке
	 * 
	 * @param activity текущая активити для отображения сообщения
	 * @param urlStr сайт для тестирования соединения
	 * @return наличие соединения
	 */
	public static boolean checkNet(String urlStr) {
		switch (NetChecker.checkNet(AppConfig.getContext(), urlStr)) {
			case CONNECTION_MISSING:
				message(Const.CONN_MISSING, "User should enable WiFi/3g etc");
				return false;
			case NO_NET:
				message(Const.NO_NET, "User has enabled network, but it's not working");
				return false;
			case FAULTY_URL:
				message(Const.FAULTY_URL, "Url of the server is faulty");
				return false;
			case NET_OK:
				return true;
			case NOT_DEFINED_YET:
				break;
		}
		return false;
	}

	/**
	 * Проверяет соединение с сайтом и выдающий сообщение на экран в потоке пользовательского интерфейса и в лог при ошибке
	 * 
	 * @param activity текущая активити для отображения сообщения
	 * @param urlStr сайт для тестирования соединения
	 * @return наличие соединения
	 */
	public static boolean checkNet(Activity activity, String urlStr) {
		switch (NetChecker.checkNet(AppConfig.getContext(), urlStr)) {
			case CONNECTION_MISSING:
				message(activity, Const.CONN_MISSING, "User should enable WiFi/3g etc");
				return false;
			case NO_NET:
				message(activity, Const.NO_NET, "User has enabled network, but it's not working");
				return false;
			case FAULTY_URL:
				message(activity, Const.FAULTY_URL, "Url of the server is faulty");
				return false;
			case NET_OK:
				return true;
			case NOT_DEFINED_YET:
				break;
		}
		return false;
	}

	/**
	 * Аналогично @see {@link ua.at.tsvetkov.net.NetCheckerHelper#checkNet(String)} только с таймаутом
	 * 
	 * @param urlStr сайт для тестирования соединения
	 * @param timeout таймаут для тестирования соединения в мс
	 * @return наличие соединения
	 */
	public static boolean checkNet(String urlStr, int timeout) {
		NetChecker.timeout = timeout;
		boolean result = checkNet(urlStr);
		NetChecker.timeout = NetChecker.TIMEOUT_DEFAULT;
		return result;
	}

	/**
	 * Аналогично @see {@link ua.at.tsvetkov.net.NetCheckerHelper#checkNet(Activity, String)} только с таймаутом
	 * 
	 * @param activity текущая активити для отображения сообщения
	 * @param urlStr сайт для тестирования соединения
	 * @param timeout таймаут для тестирования соединения в мс
	 * @return наличие соединения
	 */
	public static boolean checkNet(Activity activity, String urlStr, int timeout) {
		NetChecker.timeout = timeout;
		boolean result = checkNet(activity, urlStr);
		NetChecker.timeout = NetChecker.TIMEOUT_DEFAULT;
		return result;
	}

	/**
	 * Показывает сообщение на экране в потоке пользовательского интерфейса и выводит в лог
	 * 
	 * @param activity текущая активити
	 * @param mes сообщение
	 * @param engMes
	 */
	private static void message(final Activity activity, final String mes, final String engMes) {
		activity.runOnUiThread(new Runnable() {

			@Override
			public void run() {
				Toast.makeText(activity, mes, Toast.LENGTH_SHORT).show();
				Log.e("Internet Error - " + engMes);
			}
		});
	}

	/**
	 * Показывает сообщение на экране и выводит в лог
	 * 
	 * @param mes сообщение
	 * @param engMes
	 */
	private static void message(final String mes, final String engMes) {
		Toast.makeText(AppConfig.getContext(), mes, Toast.LENGTH_SHORT).show();
		Log.e("Internet Error - " + engMes);
	}
}
